package cn.vehicle.biz.core.support;

import cn.hutool.core.util.StrUtil;
import cn.vehicle.exception.VehicleAccessException;
import jakarta.annotation.Resource;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 车牌识别支持工厂类
 * <p>
 * 负责根据车辆类型动态获取对应的 {@link PlateDetectSupport} 实例。
 * 采用策略模式（Strategy Pattern）实现不同车辆类型的识别逻辑解耦。
 * </p>
 *
 * <p>主要职责：</p>
 * <ul>
 *   <li>从 Spring 容器中加载所有实现 {@link PlateDetectSupport} 的 Bean；</li>
 *   <li>根据传入的车辆类型返回相应的支持实现；</li>
 *   <li>在找不到匹配实现时抛出异常，提示未实现的类型。</li>
 * </ul>
 */
@Component
public class PlateDetectSupportFactory {

    @Resource
    private List<PlateDetectSupport> supportList;

    @Resource
    private ApplicationContext applicationContext;

    /**
     * 根据车辆类型获取对应的车牌识别支持实现类
     * <p>
     * 若未传入车辆类型或类型为空，则默认返回 {@code commonSupport}。
     * 若无法匹配到实现类，则抛出 {@link VehicleAccessException#IMPL_NOT_EXIST} 异常。
     * </p>
     *
     * @param vehicleType 车辆类型标识（如 TRANSPORT、COMMON 等）
     * @return 对应类型的 {@link PlateDetectSupport} 实现类实例
     */
    public PlateDetectSupport getSupport(String vehicleType) {

        // 若车辆类型为空，默认返回普通车辆的支持实现（commonSupport）
        if (StrUtil.isEmpty(vehicleType)) {
            return applicationContext.getBean("commonSupport", PlateDetectSupport.class);
        }

        // 遍历系统中所有注册的支持实现，根据车辆类型匹配具体策略类
        for (PlateDetectSupport support : supportList) {
            if (vehicleType.equals(support.supportName())) {
                return support;
            }
        }

        // 若未找到匹配的支持实现类，则抛出异常，提示系统未实现对应类型的支持逻辑
        throw VehicleAccessException.IMPL_NOT_EXIST.newInstance("can not find PlateDetectSupport");
    }

}
